package cn.wuyi.common.rest;


import java.util.List;
import java.util.Map;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;

import com.fasterxml.jackson.databind.JavaType;

import cn.wuyi.common.util.JacksonUtil;


/**
 * @类功能说明:   返回结果工具类
 * @公司名称     :中企动力
 * @作者                ：Administrator 
 * @创建时间      ：2016年10月9日 上午10:34:21  
 * @版本                ：V1.0
 */
public class ResultUtil{
	
	private static <T> String toJson(Result<T> result){
		return JacksonUtil.defaultMapper().toJson(result);
	}
	
	public static String getResult(Object data,String status,String msg){
		Result<Object> result = new Result<Object>(data,status,msg);
		return toJson(result);
	}
	
	/**
	 * @方法功能说明：单个实体数据成功返回
	 * @作者        : 
	 * @创建时间    ：2016年11月30日 下午3:18:23 
	 * @param data
	 * @param msg
	 * @return
	 */
	public static <T> String getSuccessResult(T data,String msg){
		Result<T> result = new Result<T>();
		if(data == null || StringUtils.isBlank(data.toString())){
			result.setStatus(ReturnCode.RETURN_NULL.getCode());
			result.setMsg(ReturnCode.RETURN_NULL.getMsg());
			result.setData(null);
		}else{
			result.setData(data);
			result.setStatus(ReturnCode.SUCCESS.getCode());
			result.setMsg(StringUtils.isBlank(msg) ? ReturnCode.SUCCESS.getMsg() : msg);
		}
		return toJson(result);
	}
	
	/**
	 * @方法功能说明：单条Map数据成功返回
	 * @作者        : gehonglei
	 * @创建时间    ：2016年10月11日 下午4:11:10 
	 * @param data 
	 * @param msg 
	 * @return
	 */
	public static String getSuccessResultForOne(Map<String,Object> data,String msg){
		if(MapUtils.isEmpty(data)){
			data = null;
		}
		return getSuccessResult(data, msg);
	}
	
	 
	
	/**
	 * @方法功能说明：翻页数据返回
	 * @作者        : 
	 * @创建时间    ：2018年1月31日 上午10:56:51 
	 * @param data
	 * @param msg
	 * @return
	 */
	public static <T> String getSuccessPage(ReturnPageResult<T> data,String msg){
		if(data == null || data.getList() == null || data.getList().size() == 0){
			data = null;
		}
		return getSuccessResult(data, msg);
	}
	
	/**
	 * 
	 * @方法功能说明：列表数据返回(不带有翻页对象信息)
	 * @作者        : 
	 * @创建时间    ：2018年1月31日 上午11:09:43 
	 * @param data
	 * @param msg
	 * @return
	 */
	public static <T> String getSuccessList(List<T> data,String msg){
		ReturnListResult<T> listResult = null;
		if(data != null && data.size() > 0){
			listResult = new ReturnListResult<T>(data);
		}
		return getSuccessResult(listResult, msg);
	}
	
	/**
	 * @方法功能说明：失败
	 * @作者        : 
	 * @创建时间    ：2018年1月24日 上午10:01:02 
	 * @param status
	 * @param msg
	 * @return
	 */
	public static String getErrorResult(String status,String msg){
		return toJson(new Result<Object>(status,msg));
	}
	
	/**
	 * @方法功能说明：失败：code:301
	 * @作者        : 
	 * @创建时间    ：2018年1月24日 上午10:01:48 
	 * @param msg
	 * @return
	 */
	public static String getErrorResult(String msg){
		return getErrorResult(ReturnCode.ERROR.getCode(), StringUtils.isBlank(msg) ? ReturnCode.ERROR.getMsg() : msg);
	}
	public static String getNullResult(String msg){
		return getErrorResult(ReturnCode.RETURN_NULL.getCode(), StringUtils.isBlank(msg) ? ReturnCode.RETURN_NULL.getMsg() : msg);
	}
	/**
	 * @方法功能说明：请求参数异常:code:201
	 * @作者        : 
	 * @创建时间    ：2018年1月24日 上午10:02:43 
	 * @param msg
	 * @return
	 */
	public static String getParamErrorResult(String msg){
		return getErrorResult(ReturnCode.PARAM_ERROR.getCode(), StringUtils.isBlank(msg) ? ReturnCode.PARAM_ERROR.getMsg() : msg);
	}
	
	/**
	 * @方法功能说明：调用领域服务层异常:code:401
	 * @作者        : 
	 * @创建时间    ：2018年1月24日 上午10:03:11 
	 * @param msg
	 * @return
	 */
	public static <T> String getServerErrorResult(String msg){
		return getErrorResult(ReturnCode.SERVER_ERROR.getCode(), StringUtils.isBlank(msg) ? ReturnCode.SERVER_ERROR.getMsg() : msg);
	}
	
	private static <T> Result<T> buildResult(JacksonUtil jacksonUtil,String resultJson, JavaType javaType){
		Result<T> result = jacksonUtil.fromJson(resultJson, javaType);
		if(result == null){
			result = new Result<T>(ReturnCode.ERROR.getCode(), resultJson + "数据异常");
		}
		return result;
	}
	
	/**
	 * @方法功能说明：将RESTFUL请求的响应json数据封装成Result对象，泛型对象只能为简单对象，不能是复杂对象
	 * @作者        : Administrator
	 * @创建时间    ：2016年10月13日 下午2:28:14 
	 * @param resultJson
	 * @param t
	 * @return
	 */
	public static <T> Result<T> buildResult(String resultJson, Class<T> t){
		JacksonUtil jacksonUtil = JacksonUtil.defaultMapper();
		JavaType javaType = JacksonUtil.defaultMapper().createCollectionType(Result.class, t);
		return buildResult(jacksonUtil,resultJson, javaType);
	}
	
	/**
	 * @方法功能说明：将RESTFUL请求的响应json数据封装成Result对象,Result不指定泛型对象，则泛型使用Object对象
	 * @作者        : Administrator
	 * @创建时间    ：2016年10月13日 上午10:04:49 
	 * @param resultJson
	 * @return
	 */
	public static Result<Object> buildResult(String resultJson) {
		return buildResult(resultJson, Object.class);
	}
	
	/**
	 * @方法功能说明：将RESTFUL请求的响应json数据封装成Result对象,Result中泛型对象为Map
	 * @作者        : 
	 * @创建时间    ：2017年6月21日 下午2:17:49 
	 * @param resultJson
	 * @param t  map的key对应的类型
	 * @param e  map的value对应的类型
	 * @return
	 */
	public static <T, E> Result<Map<T,E>> buildResult(String resultJson,Class<T> t,Class<E> e) {
		JacksonUtil jacksonUtil = JacksonUtil.defaultMapper();
		JavaType javaType = jacksonUtil.createJavaType(Result.class, jacksonUtil.createCollectionType(Map.class,t,e));
		return buildResult(jacksonUtil,resultJson, javaType);
	}
	
	/**
	 * @方法功能说明：将RESTFUL请求的响应json数据封装成Result对象,Result中泛型对象为List
	 * @作者        : 
	 * @创建时间    ：2017年7月24日 下午4:56:11 
	 * @param resultJson
	 * @param t
	 * @return
	 */
	public static <T> Result<List<T>> buildResultList(String resultJson,Class<T> t){
		JacksonUtil jacksonUtil = JacksonUtil.defaultMapper();
		JavaType javaType = jacksonUtil.createJavaType(Result.class, jacksonUtil.createCollectionType(List.class, t));
		return buildResult(jacksonUtil,resultJson, javaType);
	}
}
